/*
 * ResultSetTableModel.java
 *
 * Created on 3 de mayo de 2009, 01:26 PM
 */

package robot_maker;

/** La clase ResultSetTableModel se encarga de controlar el establecimiento
 * de jTables.
 *
 * @author  CarlosScipione
 */


import Excepciones.Sistema;
import Modelo.BaseDato;
import com.mysql.jdbc.exceptions.jdbc4.CommunicationsException;
import java.sql.*;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JOptionPane;
import javax.swing.table.*;


public class ResultSetTableModel extends AbstractTableModel {
   private BaseDato buscar;
   private ResultSet resultados;
   private ResultSetMetaData metaData;
   private int numeroColumnas;
   private boolean status;

   
    /** Muestra el resultado de la tabla
     *
     * @param query
     * @throws SQLException
     * @throws ClassNotFoundException
     */
   public ResultSetTableModel(String query) throws ClassNotFoundException{
        try {
            this.buscar = new BaseDato();
            setQuery(query);
        } catch (CommunicationsException ex) {
                Sistema.loggear(10, "ResultSettableModel",
                        "COMUNICACION PERDIDA CON LA BASE DE DATOS",
                        ResultSetTableModel.class, "CommunicationsException");
        } catch (IllegalStateException ex) {
            Logger.getLogger(
               ResultSetTableModel.class.getName()).log(Level.SEVERE, null, ex);
        } catch (Exception ex) {
            Logger.getLogger(
               ResultSetTableModel.class.getName()).log(Level.SEVERE, null, ex);
        }


   }

  /** Obtiene la clase que es necesaria para colocar los valores en las celdas
   *
   * @param column
   * @return Class
   * @throws IllegalStateException
   */
    @Override
   public Class getColumnClass( int column ) throws IllegalStateException
   {
      
      if ( !this.buscar.isConectadoBD() )
         //throw new IllegalStateException( "No conectado a Base de Datos" );
          JOptionPane.showMessageDialog(null,
                    "Conexion perdida a la base de datos.");
      else{
      try {
         String className = this.metaData.getColumnClassName( column + 1 );
         
         return Class.forName( className );
      }

      catch ( Exception exception ) {
         exception.printStackTrace();
      }
      }
      return Object.class;
   }

   /** Obtiene el numero de columnas que necesita la UI jTable
    *
    * @return int
    * @throws IllegalStateException
    */
   public int getColumnCount() throws IllegalStateException
   {
      
      if ( !this.buscar.isConectadoBD() )
         //throw new IllegalStateException( "No conectado a Base de Datos" );
                      status = false;

      else{
      try {
         return this.metaData.getColumnCount();
      }

      catch ( SQLException sqlException ) {
         sqlException.printStackTrace();
      }
      }
      return 1;
   }

   /** Obtiene el nombre de las columnas
    *
    * @param column
    * @return String
    * @throws IllegalStateException
    */
   @Override
   public String getColumnName( int column ) throws IllegalStateException
   {
      
      if ( !this.buscar.isConectadoBD() )
         //throw new IllegalStateException( "No conectado a Base de Datos" );
                      status = false;

      else{

      try {
         return this.metaData.getColumnLabel( column + 1 );
      }

      catch ( SQLException sqlException ) {
        // sqlException.printStackTrace();
      }
      }
      return "Prueba";
   }

   /** Obtiene el numero de filas que necesita la UI jTable
    *
    * @return int
    * @throws IllegalStateException
    */
   public int getRowCount() throws IllegalStateException   {
      
      if ( !this.buscar.isConectadoBD() )
         //throw new IllegalStateException( "No conectado a Base de Datos" );
                    status = false;

      else
      return this.numeroColumnas;
      return 1;
   }

   /** Obtiene los valores de las celdas
    *
    * @param row
    * @param column
    * @return Object
    * @throws IllegalStateException
    */
   public Object getValueAt( int row, int column )
      throws IllegalStateException
   {
      
      if ( !this.buscar.isConectadoBD() )
        // throw new IllegalStateException( "No conectado a Base de Datos" );
                      status = false;

      else{
      try {
         this.resultados.absolute( row + 1 );

         return this.resultados.getObject( column + 1 );
      }

      catch ( SQLException sqlException ) {
         sqlException.printStackTrace();
      }
      }
      return "";
   }

   /** Ejecuta el query dado para ser colocado en la tabla
    * 
    * @param query
    * @throws SQLException
    * @throws IllegalStateException
    */
   public void setQuery( String query ) throws IllegalStateException {
       
       if (!this.buscar.isConectadoBD())
         // throw new IllegalStateException("No conectado a Base de Datos");
            status = false;
       else{
            try {
                    this.resultados = this.buscar.ejecutarSqlSelect(query);

                this.metaData = resultados.getMetaData();
                this.resultados.last();
                this.numeroColumnas = resultados.getRow();
                this.fireTableStructureChanged();
            } catch (Exception ex) {
            }
       }
   }

   // termino la conexion
   

}

